---
title: 开始使用
icon: Album
---

## 介绍

这个库可以把类的实例序列化成普通的对象，用在 Project Graph 项目的保存和加载。

并且提供了一些装饰器，可以轻松的标注哪些属性和方法需要被序列化，以及如何在反序列化时传入构造函数的参数。

## 安装

需要先在 `tsconfig.json` 中启用 `experimentalDecorators` 和 `emitDecoratorMetadata` 选项。

```sh
npm install @graphif/serializer
# or use pnpm
pnpm add @graphif/serializer
```

## 用法

这是一个 `Person` 类

```ts
class Person {
  private isGreeting: boolean = false;

  constructor(
    public name: string,
    public age: number,
  ) {}

  greet() {
    this.isGreeting = true;
    console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
    this.isGreeting = false;
  }
}
```

我们想要把 `name` 和 `age` 序列化到对象中，但不包括 `isGreeting`。

使用 `@serializable` 装饰器来标注这些属性为可序列化的。

<Callout>由于技术原因，**不能**在构造函数的参数中使用 `@serializable` 装饰器。</Callout>

```ts
import { serializable } from "@graphif/serializer";

class Person {
  @serializable
  public name: string;
  @serializable
  public age: number;

  private isGreeting: boolean = false;

  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }

  greet() {
    this.isGreeting = true;
    console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
    this.isGreeting = false;
  }
}
```

然后就可以序列化了

```ts
import { serialize } from "@graphif/serializer";

const person = new Person("Alice", 25);
const serialized = serialize(person);
console.log(serialized);
```

输出

```json
{
  "_": "Person",
  "name": "Alice",
  "age": 25
}
```

你可以用 `JSON.stringify` 或者 MsgPack 保存到文件中

<Callout>每个对象中都有一个 `_` 字段，用来记录类的名称。</Callout>

反序列化也很简单

```ts
import { deserialize } from "@graphif/serializer";

const deserialized = deserialize(serialized);
console.log(deserialized);
```

输出

```ts
Person { name: "Alice", age: 25 }
```
